package modelo.dao.impl;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.Query;

import modelo.dao.GenericoDAO;

import util.FabricaConexao;

public class GenericoDAOImpl<Classe> implements GenericoDAO {

	private Classe classe;
	protected EntityManager em;

	public GenericoDAOImpl(Classe classe) {
		em = FabricaConexao.getEntityManager();
		this.classe = classe;
		System.out.println(this.classe.getClass());
	}

	@Override
	public Object recuperar(Long id) {
		try {
			abreTx();

			System.out.println("entrou recuperar");

			return em.find(classe.getClass(), id);
		} catch (Exception e) {
			e.getMessage();
			return null;
		} finally {
			// fechaConexao();
		}

	}

	@SuppressWarnings("rawtypes")
	@Override
	public List listarTodos() {
		try {
			abreTx();
			Query query = em.createQuery("select c from " + classe.getClass()+ " c");
			return query.getResultList();
		} catch (Exception e) {
			e.getMessage();
			return null;
		} finally {
			// fechaConexao();
		}

	}

	@Override
	public boolean criar() {
		try {
			abreTx();
			em.persist(classe);
			commitar();

			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		} finally {
			// fechaConexao();
		}

	}

	@Override
	public boolean deletar() {
		try {
			abreTx();
			em.remove(classe);
			commitar();
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		} finally {
			// fechaConexao();
		}
	}

	@Override
	public boolean editar() {
		try {
			abreTx();
			em.merge(classe);
			commitar();

			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		} finally {
			// fechaConexao();
		}
	}

	protected void abreTx() {
		// if (em == null) {
		// em = FabricaConexao.getEntityManager();
		// }
		em.getTransaction().begin();
	}

	// private void fechaConexao() {
	// if (em.isOpen()) {
	// em.close();
	// }
	// }

	protected void commitar() {
		em.getTransaction().commit();
	}

	@SuppressWarnings("unchecked")
	@Override
	public void changeSeed(Object classe) {
		this.classe = (Classe) classe;
	}

	@Override
	public Object getSeed() {
		return classe;
	}

}
